Array.prototype.indexOf = function(val) {              
	    for (var i = 0; i < this.length; i++) {  
	        if (this[i] == val) return i;  
	    }  
	    return -1;  
	},
	/**
	 * 删除数组中指定的元素 
	 * 例如 ： 需要删除数组中的 var a = [1,2,3]; "2" a.remove("2"); 删除后的数组是： a=[1,3];
	 * 
	 */
Array.prototype.remove = function(val) {  
    var index = this.indexOf(val);  
    if (index > -1) {  
        this.splice(index, 1);  
    }  
};

String.prototype.replaceAll = function(reallyDo, replaceWith, ignoreCase) {  
    if (!RegExp.prototype.isPrototypeOf(reallyDo)) {  
        return this.replace(new RegExp(reallyDo, (ignoreCase ? "gi": "g")), replaceWith);  
    } else {  
        return this.replace(reallyDo, replaceWith);  
    }  
}  

/**
 * CMW 移动核心JS方法
 * CmwMcore.getThousandths(100000)
 * @type 
 */
CmwMcore= {
	/**
	 * 限制只能输入数字可包含小数
	 * CmwMcore.onlyNum(this);
	 * Example:
	 * onkeyup="CmwMcore.onlyNum(this)"
	 * @param {Object} obj
	 */
	onlyNum : function (obj){
		obj.value = obj.value.replace(/[^\d.]/g,"");  //清除“数字”和“.”以外的字符  
	 	obj.value = obj.value.replace(/^\./g,"");  //验证第一个字符是数字而不是. 
	  	obj.value = obj.value.replace(/\.{2,}/g,"."); //只保留第一个. 清除多余的.   
		obj.value = obj.value.replace(".","$#$").replace(/\./g,"").replace("$#$",".");

		//if(!obj.value) obj.value = "0";
	},
	/**
	 * 限制只能输入整数数字
	 * CmwMcore.onlyIntNum(this);
	 * Example:
	 * onkeyup="CmwMcore.onlyIntNum(this)"
	 * @param {Object} obj
	 */
	onlyIntNum : function (obj){
		var val = obj.value;
		if(!val) return;
		obj.value = val.replace(/\D/g,'');
	},
	/**
	 * 元素对象是否有指定的 class 类样式
	 * @param {Object} obj	元素对象
	 * @param {Object} cls	指定的class 类样式.
	 * @return 返回boolean值，[true:存在指定的样式,false : 不存在]
	 */
	hasClass : function(obj, cls){
		 return obj.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'));  	
	},
	/**
	 * 添加 class 类样式
	 * @param {Object} obj	要添加类样式的对象
	 * @param {Object} cls	class类样式
	 */
	addClass : function (obj, cls) {  
	    if (!this.hasClass(obj, cls)) obj.className += " " + cls;  
	},
	/**
	 * 删除类样式
	 * @param {Object} obj 元素对象
	 * @param {Object} cls	要删除的类样式
	 */
	removeClass : function (obj, cls) {  
	    if (this.hasClass(obj, cls)) {  
	        var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');  
	        obj.className = obj.className.replace(reg, ' ');  
	    }  
	},
	/**
	 * 如果对象存在指定的类样式，就删除；否则，就添加样式
	 * @param {Object} obj	元素对象
	 * @param {Object} cls	类样式
	 */
	toggleClass : function (obj,cls){  
	    if(this.hasClass(obj,cls)){  
	        this.removeClass(obj, cls);  
	    }else{  
	       	this.addClass(obj, cls);  
	    }  
	},
	/**
	 * 创建命名空间的方法
	 * @return {}
	 */
    namespace : function(){
        var o, d;
        this.each(arguments, function(v) {
            d = v.split(".");
            o = window[d[0]] = window[d[0]] || {};
            CmwMcore.each(d.slice(1), function(v2){
                o = o[v2] = o[v2] || {};
            });
        });
        return o;
    },
    /**
     * 循环数组并调用函数
     * 示例 ：nums:数组， item ：元素项，index:当前索引， arr : 数组对象
     *  CmwMcore.each(nums,function(item, index, arr){});
     * @param {} array
     * @param {} fn
     * @param {} scope
     */
    each : function(array, fn, scope){
        if(this.isEmpty(array, true)){
            return;
        }
        for(var i = 0, len = array.length; i < len; i++){
            if(fn.call(scope || array[i], array[i], i, array) === false){
                return i;
            };
        }
     },
     /**
     * <p>Returns true if the passed value is empty.</p>
     * <p>The value is deemed to be empty if it is<div class="mdetail-params"><ul>
     * <li>null</li>
     * <li>undefined</li>
     * <li>an empty array</li>
     * <li>a zero length string (Unless the <tt>allowBlank</tt> parameter is <tt>true</tt>)</li>
     * </ul></div>
     * @param {Mixed} value The value to test
     * @param {Boolean} allowBlank (optional) true to allow empty strings (defaults to false)
     * @return {Boolean}
     */
    isEmpty : function(v, allowBlank){
        return v === null || v === undefined || ((this.isArray(v) && !v.length)) || (!allowBlank ? v === '' : false);
    },
   /**
     * Returns true if the passed value is a JavaScript array, otherwise false.
     * @param {Mixed} value The value to test
     * @return {Boolean}
     */
    isArray : function(v){
        return (typeof v=='object')&&v.constructor==Array;
    },

    /**
     * Returns true if the passed object is a JavaScript date object, otherwise false.
     * @param {Object} object The object to test
     * @return {Boolean}
     */
    isDate : function(v){
       return (typeof v=='object')&&v.constructor==Date;
    },

    /**
     * Returns true if the passed value is a JavaScript Object, otherwise false.
     * @param {Mixed} value The value to test
     * @return {Boolean}
     */
    isObject : function(v){
     	return (typeof v=='object')&&v.constructor==Object; 
    },
    /**
     * Returns true if the passed value is a JavaScript 'primitive', a string, number or boolean.
     * @param {Mixed} value The value to test
     * @return {Boolean}
     */
    isPrimitive : function(v){
        return this.isString(v) || this.isNumber(v) || this.isBoolean(v);
    },

    /**
     * Returns true if the passed value is a JavaScript Function, otherwise false.
     * @param {Mixed} value The value to test
     * @return {Boolean}
     */
    isFunction : function(v){
       return (typeof v=='function')&&v.constructor==Function;
    },

    /**
     * Returns true if the passed value is a number. Returns false for non-finite numbers.
     * @param {Mixed} value The value to test
     * @return {Boolean}
     */
    isNumber : function(v){
        return (typeof v=='number')&&v.constructor==Number;
    },

    /**
     * Returns true if the passed value is a string.
     * @param {Mixed} value The value to test
     * @return {Boolean}
     */
    isString : function(v){
        return (typeof v=='string')&&v.constructor==String;
    },

    /**
     * Returns true if the passed value is a boolean.
     * @param {Mixed} value The value to test
     * @return {Boolean}
     */
    isBoolean : function(v){
        return typeof v === 'boolean';
    },

    /**
     * Returns true if the passed value is an HTMLElement
     * @param {Mixed} value The value to test
     * @return {Boolean}
     */
    isElement : function(v) {
        return v ? !!v.tagName : false;
    },

    /**
     * Returns true if the passed value is not undefined.
     * @param {Mixed} value The value to test
     * @return {Boolean}
     */
    isDefined : function(v){
        return typeof v !== 'undefined';
    },
    /**
     * CmwMcore.apply(nuiObj,{title:"xxx",num:4});
     * 数据复制
     * @param reciveObj 接收对象
     * @param cfg 要复制的属性数据
     */
    apply : function(reciveObj,cfg){
	    	if(cfg) return reciveObj;
	    	if(!reciveObj) return cfg;
	    	for(var key in cfg){
	    		var nval = cfg[key];
	    		reciveObj[key] = nval;
	    	}
    },
	/**
	 * 利用 Date 的 getTime 生成唯一的 UUID
	 * 示例 ： CmwMcore.getUuid();
	 * @return {} 返回一个时间戳
	 */
	getUuid : function(){
	 	return new Date().getTime()+'';
	},
	 /**
	  * 为指定的URL 加上一个随机数，防止浏览器缓存
	  * @param {} doUrl 要加随机数的URL
	  * @return {}	返回带随机数参数的 URL
	 */
	getUrl : function(doUrl){
		var uuid = Cmw.getUuid()+"&"+JSESSIONID_KEY+"="+JSESSIONID; /*在URL后附加上 sessionId*/
		doUrl += (doUrl.indexOf("?") == -1) ? "?t="+uuid : "&t="+uuid;
		return doUrl;
	},
	/**
	 * 导入包[动态加载JS文件]
	 * @param {} path	JS文件路径
	 * @param {} fn		function 对象
	 */
	importPackage : function(path,fn){
		var pathname = location.pathname;
		var lastIndex = pathname.lastIndexOf("/");
		if(lastIndex != pathname.length-1){
			pathname = pathname.substring(0,lastIndex+1);
		}
		path = location.protocol+'//'+location.host+pathname+path+"?time_uuid="+this.getUuid();
	  	Cmw.print("path="+path);
	  	seajs.use(path, fn);
	},
	/**
	 * 打印对象
	 * @param {} obj
	 */
	print : function(obj){
		if(!window.console) return;
		if(this.isString(obj)){
			console.log(obj);
		}else{
			for(var key in obj){
				console.log(key+"="+obj[key]);
			}		
		}
	},
	/**
	 * 在指定的组件上显示 Loading 效果
	 * @param {} cmpt	要显示 Loading 效果的组件
	 * @param {} msg	Loading 时，显示的消息
	 */
	mask : function(cmpt,msg){
		var el = null;
		if(Ext.isString(cmpt)){
			el = Ext.get(cmpt);
		}else{
			el = cmpt.el;
		}
		if(!el) return;
		if(!msg) msg = 'Loading';
		el.mask(msg, 'x-mask-loading');
	},
	/**
	 * 移除指定的组件上的 Loading 效果
	 * @param {} cmpt	要移除 Loading 效果的组件
	 */
	unmask : function(cmpt){
		var el = null;
		if(Ext.isString(cmpt)){
			el = Ext.get(cmpt);
		}else{
			el = cmpt.el;
		}
		if(!el) return;
		el.unmask();
	},
	
	/**
	 * 计算两个日期之间相差多小天
	 * @param {} start开始日期
	 * @param {} end 结束日期
	 */
	calculateDays : function(start,end){
		if(start==null||start.length==0||end==null||end.length==0){ 
                return 0; 
            } 
        var arr=start.split("-");  
        var starttime=new Date(arr[0],arr[1],arr[2]);  
        var starttimes=starttime.getTime(); 
         
        var arrs=end.split("-");  
        var endtime=new Date(arrs[0],arrs[1],arrs[2]);  
        var endtimes=endtime.getTime(); 
         
        var intervalTime = endtimes-starttimes;//两个日期相差的毫秒数 一天86400000毫秒 
        var Inter_Days = ((intervalTime).toFixed(2)/86400000)+1;//加1，是让同一天的两个日期返回一天 
         
        return Inter_Days; 		
	},
	/**
	 * 计算连个日期相差的月份
	 * @param {} start 开始日期
	 * @param {} end 结束日期
	 * @return {}
	 */
	calculateMonth : function(start,end){
		 var arr = start.split("-");  
		 var arrs = end.split("-");  
		var year1 = arr[0];
        var year2 = arrs[0];
        var month1 = arr[1];
        var month2 = arrs[1];
        var len = (year2 - year1) * 12 + (month2 - month1);
        return len;
	},
	/**
	 * 获取千分位值
	 * @param {} v 要转换为千分位的数据
	 * @return {}
	 */
	getThousandths : function(num){
	  if(num){
	  	num += "";
	  }else{
	  	num = "0";
	  }
	  num = num.replace(/,/g, ""); 
      if (num.length > 10){
      	num = num.substring(0, 10);                 
      }   
      var re=/\d{1,3}(?=(\d{3})+$)/g;      
      var n1=num.replace(/^(\d+)((\.\d+)?)$/,function(s,s1,s2){return s1.replace(re,"$&,")+s2;});
      return n1;
      
//		 var num = (num || 0).toString(), result = '';
//	    while (num.length > 3) {
//	        result = ',' + num.slice(-3) + result;
//	        num = num.slice(0, num.length - 3);
//	    }
//	    if (num) { result = num + result; }
//	    return result;
	},
	/**
	 * 将金额转换成人民币大写
	 * @param {} num 要转换为大写人民币的数字
	 * @return {String} 返回大写人民币金额
	 */
	cmycurd : function (num){  //转成人民币大写金额形式
	  var str1 = '零壹贰叁肆伍陆柒捌玖';  //0-9所对应的汉字
	  var str2 = '万仟佰拾亿仟佰拾万仟佰拾元角分'; //数字位所对应的汉字
	  var str3;    //从原num值中取出的值
	  var str4;    //数字的字符串形式
	  var str5 = '';  //人民币大写金额形式
	  var i;    //循环变量
	  var j;    //num的值乘以100的字符串长度
	  var ch1;    //数字的汉语读法
	  var ch2;    //数字位的汉字读法
	  var nzero = 0;  //用来计算连续的零值是几个
	  var negative = null;
	  if(num){
	  	var t = (num+"").charAt(0); 
	  	if(t === '-')  negative = '负';
	  }
	  num = Math.abs(num).toFixed(2);  //将num取绝对值并四舍五入取2位小数
	  str4 = (num * 100).toFixed(0).toString();  //将num乘100并转换成字符串形式
	  j = str4.length;      //找出最高位
	  if (j > 15){return '溢出';}
	  str2 = str2.substr(15-j);    //取出对应位数的str2的值。如：200.55,j为5所以str2=佰拾元角分
	  
	  //循环取出每一位需要转换的值
	  for(i=0;i<j;i++){
	    str3 = str4.substr(i,1);   //取出需转换的某一位的值
	   if (i != (j-3) && i != (j-7) && i != (j-11) && i != (j-15)){    //当所取位数不为元、万、亿、万亿上的数字时
		   if (str3 == '0'){
		     ch1 = '';
		     ch2 = '';
		  	 nzero = nzero + 1;
		   }else{
		     if(str3 != '0' && nzero != 0){
		       ch1 = '零' + str1.substr(str3*1,1);
		          ch2 = str2.substr(i,1);
		          nzero = 0;
			  }else{
			    ch1 = str1.substr(str3*1,1);
			          ch2 = str2.substr(i,1);
			          nzero = 0;
			  }
		   }
	 	} else{ //该位是万亿，亿，万，元位等关键位
	      if (str3 != '0' && nzero != 0){
	        ch1 = "零" + str1.substr(str3*1,1);
	        ch2 = str2.substr(i,1);
	        nzero = 0;
	      }else{
		     if (str3 != '0' && nzero == 0){
		          ch1 = str1.substr(str3*1,1);
		          ch2 = str2.substr(i,1);
		          nzero = 0;
		  	}else{
			    if (str3 == '0' && nzero >= 3){
			            ch1 = '';
			            ch2 = '';
			            nzero = nzero + 1;
			       }else{
				      if (j >= 11){
			              ch1 = '';
			              nzero = nzero + 1;
					  }else{
					     ch1 = '';
					     ch2 = str2.substr(i,1);
					     nzero = nzero + 1;
				   	  }
	          }
	  }
	   }
	 }
	   if (i == (j-11) || i == (j-3)){  //如果该位是亿位或元位，则必须写上
	        ch2 = str2.substr(i,1);
	    }
	    str5 = str5 + ch1 + ch2;
	    
	    if (i == j-1 && str3 == '0' ){   //最后一位（分）为0时，加上“整”
	      str5 = str5 + '整';
	    }
	  }
	  if(num == 0){
	    str5 = '零元整';
	  }else{
	  	if(negative) str5 = negative+str5;
	  }
	  return str5;
	},
	/**
	 * 获取 XMLHttpRequest 对象
	 * @return {}	返回XMLHttpRequest 对象
	 */
	getXHR: function () {
        /*声明异步对象变量*/
        var xmlHttp = false;
        /*声明 扩展 名*/
        var xmlHttpObj = ["MSXML2.XMLHttp.5.0", "MSXML2.XMLHttp.4.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp", "MSXML.XMLHttp"];
        /*判断浏览器是否支持 XMLHttpRequest，如果支持，则是新式浏览器，可以直接创建*/
        if (window.XMLHttpRequest) {
            xmlHttp = new XMLHttpRequest();
        }else if (window.ActiveXObject) {/*否则，只能循环 遍历 老式浏览器 异步对象名，一一尝试创建，知道创建成功为止*/
            for (i = 0; i < xmlHttpObj.length; i++) {
                xmlHttp = new ActiveXObject(xmlHttpObj[i]);
                if (xmlHttp) {
                    break;
                }
            }
        }
        /*判断 异步对象 是否创建 成功，如果 成功，则返回异步对象，否则返回false*/
        return xmlHttp ? xmlHttp : false;
    },
   /**
    * 发送Ajax请求
    * @param {} method 提交数据方式[post,get],默认为get
    * @param {} url	服务器地址
    * @param {} data 发送的数据
    * @param {} isAyn	是否异步 [true:异步,false:同步]
    * @param {} callback	成功时执行的回调函数
    * @param {} errCallback	失败时执行的回调函数
    */
   doAjax: function (method, url, data, isAyn, callback,errCallback) {
        method = method.toLowerCase();
        /*2.1创建异步对象*/
        var xhr = this.getXHR();
        /*2.2设置请求参数（如果是get，则带url参数，如果不是，则不带）*/
        xhr.open(method, url + (method == "get" ? "?" + data : ""), isAyn);
        /*2.3根据请求谓词(get/post)，添加不同的请求头*/
        if (method == "get") {
            /*让get请求不从浏览器获取缓存数据*/
            xhr.setRequestHeader("If-Modified-Since", 0);
            xhr.send(null);
        } else {
            /*3.设置 请求 报文体 的 编码格式（设置为 表单默认编码格式*/
            xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            xhr.send(data);
        }
        /*2.4设置回调函数*/
        xhr.onreadystatechange = function () {
            /*如果接受完毕 服务器发回的 响应报文*/
            if (xhr.readyState == 4) {
            	var status = xhr.status;
                /*判断状态码是否正常*/
            	var responseText = xhr.responseText;
                var resultData = {msg:responseText,status:status}
                if (status == 200) {
                    /*正常，则调用回调函数*/
                    callback(resultData);/*当 异步对象调用 回调函数时，为回调函数 传入 xhr 对象*/
                }else { /*如果不正常，则尝试调用 异常回调函数*/
                    /*如果 异常回调函数 存在，则调用，并传入 状态码*/
                    if (errCallback) {
                        errCallback(resultData);
                    }else { /*否则，直接提示 错误~！*/
                        alert("错误啦~~状态码:" + xhr.status);
                    }
                }
            }
        };
        /*2.5发送（如果是post，则传参数，否则不传)*/
        xhr.send(method != "get" ? data : null);
    },
     /**
     * Ajax post 提交数据
     * 示例 : <br/>
     * 	var callbackObj = {sfn:function(dataResult){
     * 			var data = dataResult.msg;
     * 			var status = dataResult.status;
     * 		},ffn:function(dataResult){
     * 			var data = dataResult.msg;
     * 			var status = dataResult.status;
     * 		}
     * 	}
     * 	CmwMcore.doPost("./user.action",{userId:1,sex:0},callbackObj);
     * -----------------------------------------------------------<br/>
     * @param {} url 服务器地址
     * @param {} data	提交的数据
     * @param {} callbackObj	回调函数对象 
     * 	callbackObj	回调函数对象: 	<br/>
     * 	sfn : 响应成功时的回调函数		<br/>
     *  ffn ：响应失败时的回调函数		<br/>
     *  参数：dataResult 格式：{msg:'1',status:'404'} 说明:msg-->服务器返回的数据,status-->状态码<br/>
     * 	格式：{sfn:function(dataResult){}, ffn:function(dataResult){}}
     */
    doPost: function (url, data, callbackObj) {
    	var sfn = callbackObj.sfn;
    	var ffn = callbackObj.ffn;
        this.doAjax("post", url, data, true, sfn, ffn);
    },
    /**
     * Ajax get获取数据
     * 示例 : <br/>
     * 	var callbackObj = {sfn:function(dataResult){
     * 			var data = dataResult.msg;
     * 			var status = dataResult.status;
     * 		},ffn:function(dataResult){
     * 			var data = dataResult.msg;
     * 			var status = dataResult.status;
     * 		}
     * 	}
     * 	CmwMcore.doGet("./user.action",{userId:1,sex:0},callbackObj);
     * -----------------------------------------------------------<br/>
     * @param {} url 服务器地址
     * @param {} data	提交的数据
     * @param {} callbackObj	回调函数对象 
     * 	callbackObj	回调函数对象: 	<br/>
     * 	sfn : 响应成功时的回调函数		<br/>
     *  ffn ：响应失败时的回调函数		<br/>
     *  参数：dataResult 格式：{msg:'1',status:'404'} 说明:msg-->服务器返回的数据,status-->状态码<br/>
     * 	格式：{sfn:function(dataResult){}, ffn:function(dataResult){}}
     */
    doGet: function (url, data, callbackObj) {
    	var sfn = callbackObj.sfn;
    	var ffn = callbackObj.ffn;
    	data = this.encodePars(data);
        this.doAjax("get", url, data, true, sfn, ffn);
    },
    /**
     * 同步提交
     * @param {} url 服务器地址
     * @param {} data	提交的数据
     * @param {} callbackObj	回调函数对象 
     * 	callbackObj	回调函数对象: 	<br/>
     * 	sfn : 响应成功时的回调函数		<br/>
     *  ffn ：响应失败时的回调函数		<br/>
     *  参数：dataResult 格式：{msg:'1',status:'404'} 说明:msg-->服务器返回的数据,status-->状态码<br/>
     * 	格式：{sfn:function(dataResult){}, ffn:function(dataResult){}}
     */
    doPostBysynchro : function(url,data,callbackObj){
    	var sfn = callbackObj.sfn;
    	var ffn = callbackObj.ffn;
    	this.doAjax("post", url, data, false, sfn, ffn);
    },
     /**
     * 同步get获取数据
     * @param {} url 服务器地址
     * @param {} data	提交的数据
     * @param {} callbackObj	回调函数对象 
     * 	callbackObj	回调函数对象: 	<br/>
     * 	sfn : 响应成功时的回调函数		<br/>
     *  ffn ：响应失败时的回调函数		<br/>
     *  参数：dataResult 格式：{msg:'1',status:'404'} 说明:msg-->服务器返回的数据,status-->状态码<br/>
     * 	格式：{sfn:function(dataResult){}, ffn:function(dataResult){}}
     */
    doGetBysynchro : function(url,data,callbackObj){
    	var sfn = callbackObj.sfn;
    	var ffn = callbackObj.ffn;
    	data = this.encodePars(data);
    	this.doAjax("get", url, data, false, sfn, ffn);
    },
    /**
     * 将 data 转换成 get 请求格式字符串参数
     * @param {} data	要转成URL格式的字符串数据
     */
    encodePars : function(data){
    	if(!data) return "";
    	if(this.isString(data)) return data;
    	var pars = [];
    	for(var key in data){
    		var val = data[key] || "";
    		pars[pars.length] = key+"="+val;
    	}
    	if(!pars || pars.length == 0) return "";
    	var parsStr = pars.join("&");
    	parsStr = parsStr.substring(0,parsStr.length-1);
    	return parsStr;
    },
    /**========== DOM 操作相关方法 CODE START ============**/
    /**
	 * 通过元素名,取得该元素对象
	 * @param {} eleId
	 * @return {} 返回元素对象
	 */
	$ : function(eleId){
		return document.getElementById(eleId);
	},
	/**
	 * 通过元素名,取得该元素对象数组
	 * @param {} eleName 元素名
	 * @return {} 返回元素对象数组
	 */
	getElesByName : function(eleName){
		return document.getElementsByName(eleName);
	},
	/**
	 * 通过元素名,取得该元素对象数组
	 * @param {} eleName 元素名
	 * @return {} 返回元素对象数组
	 */
	getElementsByTagName: function(eleName){
		return document.getElementsByTagName(eleName);
	},
	/**
	 * 获取指定元素的所有子节点
	 * 示例：CmwMcore.getAllChildEles("scrollId");
	 * @param eleId 要获取子节点的元素ID
	 * @return 返回所有子元素DOM对象
	 */
	getAllChildEles : function(eleId){
		var ele = this.$(eleId);
		return ele.children || ele.childNodes;
	},
	/**
	 * 移除指定节点的所有子元素
	 * 示例：CmwMcore.removeAllChildEles("scrollId");
	 * @param {} eleId	要移除子元素的节点
	 */
	removeAllChildEles : function(eleId){
		var selfEle = this.$(eleId);
		var _childs = this.getAllChildEles(eleId);
		if(!_childs || _childs.length == 0) return;
		for(var i=0,count= _childs.length; i<count; i++){
			var _child = _childs[i];
			selfEle.removeChild(_child);
		}
	},
	/**
	 * 根据元素ID将指定元素对象从DOM中移除
	 * 示例：CmwMcore.removeSelfEle("scrollId");
	 * @param {} eleId	元素ID
	 */
	removeSelfEle : function(eleId){
		var selfEle = this.$(eleId);
		selfEle.parentNode.removeChild(selfEle); 
	},
	/**
	 * 设置指定的元素或图片渐显效果
	 * @param {} elem 元素ID或元素对象	
	 */
	fadeIn :function (elem) {
		if(this.isString(elem)) elem = this.$(elem);
		this.setOpacity(elem, 0)
		var _this = this;
		for ( var i = 0; i < 20; i++) {
			(function() {
				var pos = i * 5;
				setTimeout(function() {
					_this.setOpacity(elem, pos)
				}, i * 25);
			})(i);
		}
	},
	/**
	 * 设置指定的元素或图片渐失效果
	 * @param {} elem 元素ID或元素对象	
	 */
	fadeOut : function(elem) {
		if(this.isString(elem)) elem = this.$(elem);
		var _this = this;
		for ( var i = 0; i <= 20; i++) {
			(function() {
				var pos = 100 - i * 5;
				setTimeout(function() {
					_this.setOpacity(elem, pos)
				}, i * 25);
			})(i);
		}
	},
	/**
	 * 设置指定的元素的透明度
	 * @param {} elem 元素对象
	 * @param level 透明值 注：透明值不能超过100
	 */
	setOpacity : function (elem, level) {
		if (elem.filters) {
			elem.style.filter = "alpha(opacity=" + level + ")";
		} else {
			elem.style.opacity = level / 100;
		}
	},
	/**
	 * 获取指定元素的宽和高
	 * @param {} ele	元素对象
	 * @retun 返回元素大小 {width:宽,height:高}
	 */
	getSize : function(ele){
		var clientWidth = ele.clientWidth;
		var clientHeight = ele.clientHeight;
		return {width:clientWidth,height:clientHeight};
	},
	/**========== DOM 操作相关方法 CODE END ============**/
	/**
	 * 按钮配置
	 * @type 
	 */
	btnCfg : {},
	/**
	 * CmwCore.disabled('invest');
	 * 禁用Button
	 * @param id 元素ID 
	 * @param waitMsg 禁用时显示的文本	
	 */
	disabled : function(id,waitMsg){
		var ele = $('#'+id);
		var isInput = ele.is("input");
		var txt = isInput ? ele.val() : ele.text();
		this.btnCfg[id] = {text:txt};
		ele.prop("disabled", true);    
		ele.css("background-color","#A1ACB4");
		if(!waitMsg) waitMsg = "请稍候...";
		if(isInput){
			ele.val(waitMsg);
		}else{
			ele.text(waitMsg);
		}
	},
	/**
	 * 启用按钮
	 * @param id 按钮ID
	 */
	enabled : function(id,clickFun){
		var data = this.btnCfg[id];
		var text = data.text;
		var ele = $('#'+id);
		var isInput = ele.is("input");
		ele.prop("disabled", false); 
		ele.removeAttr("style");
		if(isInput){
			ele.val(text);
		}else{
			ele.text(text);
		}
	}
};

/**
 * 获取按等比例的元素宽高
 * @param {} maxWidth
 * @param {} maxHeight
 */
CmwMcore.getAutoResize = function(img,maxWidth,maxHeight){
	var hRatio;
	var wRatio;
	var ratio = 1;
	var w = img.width;
	var h = img.height;
	wRatio = maxWidth / w;
	hRatio = maxHeight / h;
	if (maxWidth ==0 && maxHeight==0){
		ratio = 1;
	}else if (maxWidth==0){//
		if (hRatio<1) ratio = hRatio;
	}else if (maxHeight==0){
		if (wRatio<1) ratio = wRatio;
	}else if (wRatio<1 || hRatio<1){
		ratio = (wRatio<=hRatio?wRatio:hRatio);
	}
	if (Ratio<1){
		w = w * Ratio;
		h = h * Ratio;
	}
}

CmwMcore.setAutoResize = function(img,defaultWidth,defaultHeight,maxWidth,maxHeight){
	var hRatio;
	var wRatio;
	var ratio = 1;
	var w = defaultWidth;
	var h = defaultHeight;
	wRatio = maxWidth / w;
	hRatio = maxHeight / h;
	if (maxWidth ==0 && maxHeight==0){
		ratio = 1;
	}else if (maxWidth==0){//
		if (hRatio<1) ratio = hRatio;
	}else if (maxHeight==0){
		if (wRatio<1) ratio = wRatio;
	}else if (wRatio<1 || hRatio<1){
		ratio = (wRatio<=hRatio?wRatio:hRatio);
	}
	if (ratio<1){
		w = w * ratio;
		h = h * ratio;
	}
	img.height = h;
	img.width = w;
}

/**-----------> 浏览器版本判断 2015-03-25 ADD <-----------**/
CmwMcore.ie = false;		/*是否IE浏览器，true:是,false:非IE*/
CmwMcore.firefox = false;	/*是否FireFox浏览器，true:是,false:非FireFox*/
CmwMcore.chrome = false;	/*是否Chorme浏览器，true:是,false:非Chorme*/
CmwMcore.opera = false;		/*是否Opera浏览器，true:是,false:非Opera*/
CmwMcore.safari = false;	/*是否Safari浏览器，true:是,false:非Safari*/
(CmwMcore.checkBrowerType = function(){
	 var ua = navigator.userAgent.toLowerCase();
	 var s;
	 (s = ua.match(/msie ([\d.]+)/)) ? CmwMcore.ie = s[1] :
	 (s = ua.match(/firefox\/([\d.]+)/)) ? CmwMcore.firefox = s[1] :
	 (s = ua.match(/chrome\/([\d.]+)/)) ? CmwMcore.chrome = s[1] :
	 (s = ua.match(/opera.([\d.]+)/)) ? CmwMcore.opera = s[1] :
	 (s = ua.match(/version\/([\d.]+).*safari/)) ? CmwMcore.safari = s[1] : 0;
})();
/**--------------------->	2010-10-30 START CODE	<-----------------**/

/**
 * HashMap 类
 */
var HashMap = function() {
  this.initialize();
}
 
HashMap.hashmap_instance_id = 0;
 
HashMap.prototype = {
  hashkey_prefix: "<#HashMapHashkeyPerfix>",
  hashcode_field: "<#HashMapHashcodeField>",
 
  initialize: function() {
    this.backing_hash = {};
    this.code = 0;
    this.size = 0;
    HashMap.hashmap_instance_id += 1;
    this.instance_id = HashMap.hashmap_instance_id;
  },
 
  hashcodeField: function() {
    return this.hashcode_field + this.instance_id;
  },
  /*
   maps value to key returning previous assocciation
   */
  put: function(key, value) {
    var prev;
 
    if (key && value) {
      var hashCode;
      if (typeof(key) === "number" || typeof(key) === "string") {
        hashCode = key;
      } else {
        hashCode = key[this.hashcodeField()];
      }
      if (hashCode) {
        prev = this.backing_hash[hashCode];
      } else {
        this.code += 1;
        hashCode = this.hashkey_prefix + this.code;
        key[this.hashcodeField()] = hashCode;
      }
      this.backing_hash[hashCode] = [key, value];
      this.size++;
    }
    return prev === undefined ? undefined : prev[1];
  },
  /*
   returns value associated with given key
   */
  get: function(key) {
    var value;
    if (key) {
      var hashCode;
      if (typeof(key) === "number" || typeof(key) === "string") {
        hashCode = key;
      } else {
        hashCode = key[this.hashcodeField()];
      }
      if (hashCode) {
        value = this.backing_hash[hashCode];
      }
    }
    return value === undefined ? undefined : value[1];
  },
  /*
   deletes association by given key.
   Returns true if the assocciation existed, false otherwise
   */
  remove: function(key) {
    var success = false;
    if (key) {
      var hashCode;
      if (typeof(key) === "number" || typeof(key) === "string") {
        hashCode = key;
      } else {
        hashCode = key[this.hashcodeField()];
      }
      if (hashCode) {
        var prev = this.backing_hash[hashCode];
        this.backing_hash[hashCode] = undefined;
        delete this.backing_hash[hashCode];
        this.size--;
        if (prev !== undefined){
          key[this.hashcodeField()] = undefined; //let's clean the key object
          success = true;
        }
      }
    }
    return success;
  },
  /*
   iterate over key-value pairs passing them to provided callback
   the iteration process is interrupted when the callback returns false.
   the execution context of the callback is the value of the key-value pair
   @ returns the HashMap (so we can chain)                                                                  (
   */
  each: function(callback, args) {
    var key;
    for (key in this.backing_hash){
      if (callback.call(this.backing_hash[key][1], this.backing_hash[key][0], this.backing_hash[key][1]) === false)
        break;
    }
    return this;
  },
  toString: function() {
    return "HashMap"
  },
  /**
   * 获取 HashMap 对象的大小
   * @return {} 返回对象大小
   */
  getSize : function(){
  	return this.size;
  },
  /**
   * 以数组形式返回 HahsMap 中的所有值。
   * @return Array 以数组形式返回所有值
   */
  getValues : function(){
  	var values = [];
  	var index = 0;
  	for (key in this.backing_hash){
  		var val = this.get(key);
  		if(!val) continue;
     	values[index++] = val;
    }
    return values;
  },
  /**
   * 以数组形式返回 HahsMap 中的所有键。
   * @return Array 以数组形式返回所有键
   */
  getKeys : function(){
  	var keys = [];
  	var index = 0;
  	for (key in this.backing_hash){
     	keys[index++] = key;
    }
    return keys;
  },
  /**
   * 清空 HashMap 对象所有元素
   */
  clear : function(){
  	HashMap.hashmap_instance_id=0;
  	this.initialize();
  }
}

/**
 * HTML5 移动APP 事件管理对象
 * 当不在手机上访问时，对相关事件做了平滑处理。
 * 	例如：手机访问时，用 touchstart 事件，PC上访问时用 click 事件.
 * @type 
 */
MeventMgr = {
	/**
	 * MeventMgr.fireEvent('add_record','touchstart');
	 * 触发指定元素的DOM事件
	 * @param {Object} eleId	 DOM元素ID
	 * @param {Object} eventType		事件类型 ['click','touchstart']
	 */
	fireEvent : function(eleId,eventType){
	  var fireOnThis = CmwMcore.$(eleId);
	  if( document.createEvent ){
	        var evObj = document.createEvent('MouseEvents');
	        evObj.initEvent( eventType, true, false );
	        fireOnThis.dispatchEvent(evObj);
	  }else if( document.createEventObject ){
	      fireOnThis.fireEvent('on'+eventType); 
	  }
	},
	/**
	 * 当为PC时，指 鼠标经过事件
	 * 当为Mobile 或 Pad 时，指 手指开始按下事件
	 * 示例：
	 * MeventMgr.onMouseover(ele,function(event,self){});
	 * 
	 * @param ele 要绑定事件的元素对象
	 * @param callback 事件回调函数
	 */
	onMouseover : function(ele,callback){
		var supportTouch = this.checkTouch();
		var eventType = "mouseover";
		if(supportTouch) eventType = "touchstart";
		ele.addEventListener(eventType, function(event) {
	  		callback(event,this);
	  		 event.preventDefault();
		}, false);
	},
	/**
	 * 当为PC时，指 鼠标移出事件
	 * 当为Mobile 或 Pad 时，指 手指结束按下事件
	 * 示例：
	 * MeventMgr.onMouseout(ele,function(event,self){});
	 * onmouseout
	 * @param ele 要绑定事件的元素对象
	 * @param callback 事件回调函数
	 */
	onMouseout : function(ele,callback){
		var supportTouch = this.checkTouch();
		var eventType = "mouseout";
		if(supportTouch) eventType = "touchend";
		ele.addEventListener(eventType, function(event) {
	  		callback(event,this);
	  		 event.preventDefault();
		}, false);
	},
	/**
	 * 当手指触摸屏幕时候触发，即使已经有一个手指放在屏幕上也会触发.
	 * 示例：
	 * MeventMgr.onTouchstart(ele,function(event,self){});
	 * 
	 * @param ele 要绑定事件的元素对象
	 * @param callback 事件回调函数
	 */
	onTouchstart : function(ele,callback){
		var supportTouch = this.checkTouch();
		var eventType = "touchstart";
		if(!supportTouch) eventType = "click";
		if(!ele) return; 
		window.setTimeout(function(){
			ele.addEventListener(eventType, function(event) {
				var _this = this;
				console.log("_this="+_this); 
				callback(event,_this);
		  		event.preventDefault();
			}, false);
		},150);
	},
	/**
	 * 当系统停止跟踪触摸的时候触发。关于这个事件的确切出发时间，文档中并没有具体说明，咱们只能去猜测了。
	 * 示例：
	 * MeventMgr.onTouchcancel(ele,function(event,self){});
	 * @param ele 要绑定事件的元素对象
	 * @param callback 事件回调函数
	 */
	onTouchcancel : function(ele,callback){
		var supportTouch = this.checkTouch();
		var eventType = "touchcancel";
		if(!supportTouch) eventType = "click";
		ele.addEventListener(eventType, function(event) {
	  		callback(event,this);
	  		 event.preventDefault();
		}, false);
	},
	/**
	 * 当手指在屏幕上滑动的时候连续地触发。在这个事件发生期间，调用preventDefault()事件可以阻止滚动。
	 * 示例：
	 * MeventMgr.onTouchmove(ele,function(event,self){});
	 * @param ele 要绑定事件的元素对象
	 * @param callback 事件回调函数
	 */
	onTouchmove : function(ele,callback){
		var supportTouch = this.checkTouch();
		var eventType = "touchmove";
		if(!supportTouch) eventType = "click";
		ele.addEventListener(eventType, function(event) {
	  		callback(event,this);
	  		 event.preventDefault();
		}, false);
	},
	/**
	 * 当手指触摸屏幕时候触发，即使已经有一个手指放在屏幕上也会触发.
	 * 示例：
	 * MeventMgr.onTouchend(ele,function(event,self){});
	 * @param ele 要绑定事件的元素对象
	 * @param callback 事件回调函数
	 */
	onTouchend : function(ele,callback){
		var supportTouch = this.checkTouch();
		var eventType = "touchend";
		if(!supportTouch) eventType = "click";
		ele.addEventListener(eventType, function(event) {
	  		callback(event,this);
	  		 event.preventDefault();
		}, false);
	},
	/**
	 * 当键盘按下时触发.
	 * 示例：
	 * MeventMgr.onKeydown(ele,function(event,self){});
	 * @param ele 要绑定事件的元素对象
	 * @param callback 事件回调函数
	 */
	onKeydown : function(ele,callback){
		var supportTouch = this.checkTouch();
		var eventType = "keydown";
		if(!supportTouch) eventType = "keydown";
		ele.addEventListener(eventType, function(event) {
	  		callback(event,this);
	  		 event.preventDefault();
		}, false);
	},
	/**
	 * 当按键弹起时触发.
	 * 示例：
	 * MeventMgr.onKeyup(ele,function(event,self){});
	 * @param ele 要绑定事件的元素对象
	 * @param callback 事件回调函数
	 */
	onKeyup : function(ele,callback){
		var supportTouch = this.checkTouch();
		var eventType = "keyup";
		if(!supportTouch) eventType = "keyup";
		ele.addEventListener(eventType, function(event) {
	  		callback(event,this);
	  		 event.preventDefault();
		}, false);
	},
	/**
	 * 当失去焦点时触发.
	 * 示例：
	 * MeventMgr.onBlur(ele,function(event,self){});
	 * @param ele 要绑定事件的元素对象
	 * @param callback 事件回调函数
	 */
	onBlur : function(ele,callback){
		var supportTouch = this.checkTouch();
		var eventType = "blur";
		if(!supportTouch) eventType = "blur";
		ele.addEventListener(eventType, function(event) {
	  		callback(event,this);
	  		 event.preventDefault();
		}, false);
	},
	/**
	 * 当文本框改变时触发.
	 * 示例：
	 * MeventMgr.onChange(ele,function(event,self){});
	 * @param ele 要绑定事件的元素对象
	 * @param callback 事件回调函数
	 */
	onChange : function(ele,callback){
		var supportTouch = this.checkTouch();
		var eventType = "change";
		if(!supportTouch) eventType = "change";
		ele.addEventListener(eventType, function(event) {
	  		callback(event,this);
	  		 event.preventDefault();
		}, false);
	},
	/**
	 * 检查是否支持触摸操作
	 * @return {}	返回布尔值 [true:支持，false:不支持]
	 */
	checkTouch : function(){
		var supportTouch = ("createTouch" in document);
		return supportTouch;
	}
}

/**
 * JS 字符处理类扩展函数 
 */
 
 /**
 * String 替换所有指定字符串函数
 * @param {} s1	要替换的字符串
 * @param {} s2	新的字符串
 * @return {}	返回替换后的新字符串
 */
String.prototype.replaceAll = function(s1,s2){
	var r = new RegExp(s1.replace(/([\(\)\[\]\{\}\^\$\+\-\*\?\.\"\'\|\/\\])/g,"\\$1"),"ig");
	return this.replace(r,s2);
}

/**
 * 字符处理类
 * @type 
 */
var StringHandler = {
	/**
	 * 验证指定的值是否存在
	 * 如果传入的值为0,该方法将返回 true (验证通过);反之，失败 
	 * example : StringHandler.isValidVal("0") ---> return true;
	 * @param {} val 要验证的值 
	 * @return {} 返回 Boolean 值  true : 验证通过, false : 不通过
	 */
	isValidVal : function(val){
		var flag = (!val && val !==0 ) ? false : true;
		return flag;
	},
	/**
	 * StringHandler.forDight(15.989,2)
	 * 四舍五入
	 * @param {} dight 要四舍五入的数字
	 * @param {} how	保留的小数位数
	 * @return {} 
	 */
	forDight : function(dight,how){    
	   dight  =  Math.round  (dight*Math.pow(10,how))/Math.pow(10,how);    
	   return  dight;    
	},
	/**
	 * 验证指定的值是否为空，如果为空并且提供了 errMsg ，将弹出错误提示框
	 * @param {} val 要验证是否为空的值
	 * @param {} errMsg	当 val 为空时,显示的错误消息
	 * @return {} 返回 boolean 值 ,当为空时返回 false,否则，返回 true
	 */
	isNull : function(val,errMsg){
		var flag = (!val && val !==0 ) ? false : true;
		if(!flag && errMsg){
			ExtUtil.error({msg:errMsg});
		}
		return flag;
	}
}

var DateUtil = {
}


/**
 * 
 * var myencodedstring = Ext.util.base64.encode("Testtext"); //returns VGVzdHRleHQ
 *	var mydecodedstring = Ext.util.base64.decode("VGVzdHRleHQ="); //returns Testtext  
 * 加密工具
 * @type 
 */
CmwMcore.Base64Util = {

    base64s : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
    
    encode: function(decStr){
        if (typeof btoa === 'function') {
             return btoa(decStr);            
        }
        var base64s = this.base64s;
        var bits;
        var dual;
        var i = 0;
        var encOut = "";
        while(decStr.length >= i + 3){
            bits = (decStr.charCodeAt(i++) & 0xff) <<16 | (decStr.charCodeAt(i++) & 0xff) <<8 | decStr.charCodeAt(i++) & 0xff;
            encOut += base64s.charAt((bits & 0x00fc0000) >>18) + base64s.charAt((bits & 0x0003f000) >>12) + base64s.charAt((bits & 0x00000fc0) >> 6) + base64s.charAt((bits & 0x0000003f));
        }
        if(decStr.length -i > 0 && decStr.length -i < 3){
            dual = Boolean(decStr.length -i -1);
            bits = ((decStr.charCodeAt(i++) & 0xff) <<16) |    (dual ? (decStr.charCodeAt(i) & 0xff) <<8 : 0);
            encOut += base64s.charAt((bits & 0x00fc0000) >>18) + base64s.charAt((bits & 0x0003f000) >>12) + (dual ? base64s.charAt((bits & 0x00000fc0) >>6) : '=') + '=';
        }
        return(encOut);
    },
    
    decode: function(encStr){
        if (typeof atob === 'function') {
            return atob(encStr); 
        }
        var base64s = this.base64s;        
        var bits;
        var decOut = "";
        var i = 0;
        for(; i<encStr.length; i += 4){
            bits = (base64s.indexOf(encStr.charAt(i)) & 0xff) <<18 | (base64s.indexOf(encStr.charAt(i +1)) & 0xff) <<12 | (base64s.indexOf(encStr.charAt(i +2)) & 0xff) << 6 | base64s.indexOf(encStr.charAt(i +3)) & 0xff;
            decOut += String.fromCharCode((bits & 0xff0000) >>16, (bits & 0xff00) >>8, bits & 0xff);
        }
        if(encStr.charCodeAt(i -2) == 61){
            return(decOut.substring(0, decOut.length -2));
        }
        else if(encStr.charCodeAt(i -1) == 61){
            return(decOut.substring(0, decOut.length -1));
        }
        else {
            return(decOut);
        }
    }
};
